#!/usr/bin/env python
# coding: utf-8

# In[4]:


import pandas as pd 
import pymysql

# 获取用户信息
try:
    conn = pymysql.connect(host="localhost", user="test", passwd="123456", db='course', charset="utf8")
    cursor = conn.cursor()
    print("数据库连接成功！")
except Exception as e:
    print(e)


sql = 'select * from update_with_tar;'
try:
    cursor.execute(sql)
    res = cursor.fetchall()
    cols = [cursor.description[i][0] for i in range(len(cursor.description))]
    df = pd.DataFrame(res, columns=cols)
    print("数据获取成功！")
    cursor.close()
    conn.commit()
    conn.close()
except Exception as e:
    print(e)
    

import argparse
import numpy as np

# 初始化参数构造器
parser = argparse.ArgumentParser()

# 在参数构造器中添加两个命令行参数
parser.add_argument('--filename', type=str,default="用户修改信息次数和逾期率之间的关系")

# 获取所有的命令行参数
args = parser.parse_args(args=[])
#args=[]

filename = args.filename # 文件名


# In[63]:


df2 = df.copy()  # 拷贝信息

# 计算用户修改信息次数
temp = df2.groupby(by=["Idx"])[["UserupdateInfo2", "target"]].agg({"UserupdateInfo2":"nunique","target":"mean"}).sort_values(by="UserupdateInfo2", ascending=True)

# 可视化
import warnings;warnings.filterwarnings("ignore")
from matplotlib import pyplot as plt
import seaborn as sns
plt.rcParams["font.sans-serif"] = ["SimHei"]  # 正常显示中文
plt.rcParams["axes.unicode_minus"] = False # 正常显示负号
import seaborn as sns


plt.figure(figsize=(20, 8), dpi=100)
# 异常点检测
plt.subplot(121)
sns.scatterplot(x=range(len(temp)), y=temp["UserupdateInfo2"],color="orange") # 散点图
plt.plot(range(len(temp)), [5] * len(temp),color="pink")
plt.text(30200,5.5,5,fontdict={"fontsize":15})
plt.ylabel("用户修改信息的天数",fontdict={"fontsize":20})
plt.xlabel("索引（Index）",fontdict={"fontsize":20})
plt.title("用户修改天数分布情况",fontdict={"fontsize":20})
# plt.ylim((0,12))
plt.xticks(range(len(temp))[::5999],temp.index[::5999])  # 刻度设置

# 剔除大于5天的偶然值
df_s = temp[temp["UserupdateInfo2"] <= 5]

# 计算每种修改次数的逾期率
def get_p(df):
    freq = len(df[df["target"] == 1.0]) # 计算逾期个数
    p = freq/len(df)  # 计算逾期率
    return p

p_all = []
for i in range(1,6): # 遍历所有次数情况
    df_i = df_s[df_s["UserupdateInfo2"] == i]  # 获得当前次数样本
    p = get_p(df_i)  # 计算逾期率
    p_all.append(p)
df_times = pd.DataFrame(list(zip(range(1,6), p_all)), columns=["修改信息天数", "逾期率"])
plt.subplot(122)
sns.barplot(x=df_times["修改信息天数"], y=df_times["逾期率"])
plt.title("用户修改信息情况和逾期率之间的关系", fontdict={"fontsize":20})
plt.tight_layout()
plt.xlabel("修改信息天数",fontdict={"fontsize":20})
plt.ylabel("逾期率",fontdict={"fontsize":20})
# plt.show()
plt.tight_layout() # 自动适应调整输出图片大小
plt.savefig(filename+".png")

